#include "geopolygon.h"

geoPolygon::geoPolygon()
{

}

geoPolygon::~geoPolygon()
{

}

bool geoPolygon::isPointWithin(QPointF p)
{
    int nCross = 0;

    for(int i=0;i<projectedCoordinates.count();i++){
        QPointF p1 = projectedCoordinates.at(i);

        QPointF p2 = projectedCoordinates.at((i+1) % projectedCoordinates.count());

        double ymin = p1.y()<p2.y()?p1.y():p2.y();
        double ymax = p1.y()>p2.y()?p1.y():p2.y();

        if(p1.y() == p2.y())
            continue;
        if(p.y() < ymin)
            continue;
        if(p.y() >= ymax)
            continue;
        double x= (p.y() - p1.y())*(p2.x() - p1.x())
                /(p2.y() -p1.y()) + p1.x();
        if(x > p.x())
            nCross++;
    }
    if(nCross%2==1) return true;
    return false;

//    double x1,y1,x2,y2;int count=0;
//    for(int i=0;i<coordinates.count();i++)
//    {
//        if(i+1 == coordinates.count())
//            continue;
//            if(coordinates.at(i).x()>=p.x()&&coordinates.at(i+1).x()>=p.x())
//          {
//            if(coordinates.at(i).y()>=coordinates.at(i+1).y())
//            {
//                y1=coordinates.at(i).y(); //y1代表大的y
//                x1=coordinates.at(i).x();
//                y2=coordinates.at(i+1).y();
//                x2=coordinates.at(i+1).x();
//            }
//            else
//            {
//                y1=coordinates.at(i+1).y(); //y1代表大的y
//                x1=coordinates.at(i+1).x();
//                y2=coordinates.at(i).y();
//                x2=coordinates.at(i).x();
//            }
//          /*  double xs= (y - y2)*(x1 - x2)/(y1-y2) + x2;
//            if(xs > x)
//                count++;*/
//            if(p.y()<=y1&&p.y()>=y2)
//                count=count+1;
//           }
//}
//    //qDebug()<<count<<"ljj";
//    if(count%2==1)
//    {
//        return true;
//    }
//    else
//        return false;


}

bool geoPolygon::isPointOnLine(QPointF pt,QPointF end1,QPointF end2)
{
    double maxOff=0.0001;
    double d1 = (end1.x() - pt.x()) * (end2.ry() - pt.y()) - (end2.x() - pt.x()) * (end1.y() - pt.y());
    if ((abs(d1) < maxOff) && ((pt.x() - end1.x()) * (pt.x() - end2.x()) <= 0) && ((pt.y() - end1.y()) * (pt.y() - end2.y()) <= 0))
        return true;
    else    return false;
}

bool geoPolygon::isIntersect(QPointF pt1,QPointF pt2,QPointF end1,QPointF end2)
{
    double d = (pt2.x() - pt1.x()) * (end2.y() - end1.y()) - (pt2.y() - pt1.y()) * (end2.x() - end1.x());
    if (d > 0||d<0)
    {
        double r = ((pt1.y() - end1.y()) * (end2.x() - end1.x()) - (pt1.x() - end1.x()) * (end2.y() - end1.y())) / d;
        double s = ((pt1.y() - end1.y()) * (pt2.x() - pt1.x()) - (pt1.x() - end1.x()) * (pt2.y() - pt1.y())) / d;
        if ((r >= 0) && (r <= 1) && (s >= 0) && (s <= 1))
            return true;
    }
    return false;
}



